/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ongd.negocio.gestion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 * Clase que corresponde con la entidad proyecto de la base de datos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@Entity
@Table(name = "proyecto")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Proyecto.findAll", query = "SELECT p FROM Proyecto p"),
    @NamedQuery(name = "Proyecto.findByIdProyecto", query = "SELECT p FROM Proyecto p WHERE p.idProyecto = :idProyecto"),
    @NamedQuery(name = "Proyecto.findByNombre", query = "SELECT p FROM Proyecto p WHERE p.nombre = :nombre"),
    @NamedQuery(name = "Proyecto.findByActivo", query = "SELECT p FROM Proyecto p WHERE p.activo = :activo"),
    @NamedQuery(name = "Proyecto.findByLocalidad", query = "SELECT p FROM Proyecto p WHERE p.localidad = :localidad"),
    @NamedQuery(name = "Proyecto.findByProvincia", query = "SELECT p FROM Proyecto p WHERE p.provincia = :provincia"),
    @NamedQuery(name = "Proyecto.findByRegion", query = "SELECT p FROM Proyecto p WHERE p.region = :region"),
    @NamedQuery(name = "Proyecto.findByPais", query = "SELECT p FROM Proyecto p WHERE p.pais = :pais"),
    @NamedQuery(name = "Proyecto.findByDocumentoAdjunto", query = "SELECT p FROM Proyecto p WHERE p.documentoAdjunto = :documentoAdjunto"),
    @NamedQuery(name = "Proyecto.findBySocioLocal", query = "SELECT p FROM Proyecto p WHERE p.socioLocal = :socioLocal"),
    @NamedQuery(name = "Proyecto.findByFechaInicio", query = "SELECT p FROM Proyecto p WHERE p.fechaInicio = :fechaInicio"),
    @NamedQuery(name = "Proyecto.findByResponsableONGD", query = "SELECT p FROM Proyecto p WHERE p.responsableONGD = :responsableONGD"),
    @NamedQuery(name = "Proyecto.findByFechaEntrega", query = "SELECT p FROM Proyecto p WHERE p.fechaEntrega = :fechaEntrega"),
    @NamedQuery(name = "Proyecto.findByPresupuestoTotal", query = "SELECT p FROM Proyecto p WHERE p.presupuestoTotal = :presupuestoTotal"),
    @NamedQuery(name = "Proyecto.findByFechaFin", query = "SELECT p FROM Proyecto p WHERE p.fechaFin = :fechaFin"),
    @NamedQuery(name = "Proyecto.findByTipo", query = "SELECT p FROM Proyecto p WHERE p.tipo = :tipo"),
    @NamedQuery(name = "Proyecto.findByDescripcion", query = "SELECT p FROM Proyecto p WHERE p.descripcion = :descripcion")})
public class Proyecto extends Entidad implements Serializable {

    /**
     * Atributo serialVersionUID.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Atributo que corresponde con la clave primaria.
     */
    @Id
    @Basic(optional = false)
    @Column(name = "idProyecto")
    private Integer idProyecto;
    /**
     * Atributo que corresponde con el nombre del proyecto.
     */
    @Basic(optional = false)
    @Column(name = "Nombre")
    private String nombre;
    /**
     * Atributo que indica si el proyecto es activo.
     */
    @Basic(optional = false)
    @Column(name = "Activo")
    private boolean activo;
    /**
     * Atributo que corresponde con la localidad de realizaciónd del proyecto.
     */
    @Column(name = "Localidad")
    private String localidad;
    /**
     * Atributo que corresponde con la provincia de realización del proyecto.
     */
    @Column(name = "Provincia")
    private String provincia;
    /**
     * Atributo que corresponde con la región de realización del proyecto.
     */
    @Column(name = "Region")
    private String region;
    /**
     * Atributo que corresponde con el pais de realización del proyecto.
     */
    @Basic(optional = false)
    @Column(name = "Pais")
    private String pais;
    /**
     * Atributo que corresponde con información adjunta del proyecto.
     */
    @Column(name = "Documento_Adjunto")
    private String documentoAdjunto;
    /**
     * Atributo que corresponde con el socio local.
     */
    @Column(name = "Socio_Local")
    private String socioLocal;
    /**
     * Atributo que corresponde con la fecha de inicio.
     */
    @Column(name = "Fecha_Inicio")
    @Temporal(TemporalType.DATE)
    private Date fechaInicio;
    /**
     * Atributo que corresponde con el responsable de la ONGD.
     */
    @Basic(optional = false)
    @Column(name = "Responsable_ONGD")
    private String responsableONGD;
    /**
     * Atributo que corresponde con la fecha de entrega.
     */
    @Column(name = "Fecha_Entrega")
    @Temporal(TemporalType.DATE)
    private Date fechaEntrega;
    /**
     * Atributo que corresponde con el presupuesto total.
     */
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "Presupuesto_Total")
    private Double presupuestoTotal;
    /**
     * Atributo que corresponde con la fecha de fin.
     */
    @Column(name = "Fecha_Fin")
    @Temporal(TemporalType.DATE)
    private Date fechaFin;
    /**
     * Atributo que corresponde con el tipo del proyecto.
     */
    @Basic(optional = false)
    @Column(name = "Tipo")
    private String tipo;
    /**
     * Atributo que corresponde con la descripción.
     */
    @Column(name = "Descripcion")
    private String descripcion;
    /**
     * Atributo que corresponde con las personas relacionadas con el proyecto.
     */
    @ManyToMany(mappedBy = "proyectoList")
    private List<Persona> personaList;
    /**
     * Atributo que corresponde con las subvenciones relacionadas con el 
     * proyecto.
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "proyecto")
    private List<Subvencion> subvencionList;
    /**
     * Atributo que corresponde con los apadrinados relacionados con el 
     * proyecto.
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "proyecto")
    private List<Apadrinado> apadrinadoList;
    /**
     * Atributo que corresponde con las personas de contacto relacionadas 
     * con el proyecto.
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "proyecto")
    private List<PersonaContacto> personaContactoList;

    /**
     * Constructor de la clase.
     */
    public Proyecto() {
    }

    /**
     * Constructor de la clase.
     * @param idProyecto Identificador del proyecto
     */
    public Proyecto(Integer idProyecto) {
        this.idProyecto = idProyecto;
    }

    /**
     * Constructor de la clase.
     * @param idProyecto Identificador del proyecto
     * @param nombre Nombre del proyecto
     * @param activo Activo del proyecto
     * @param pais Pais de realización del proyecto
     * @param responsableONGD Responsable del proyecto
     * @param tipo Tipo de proyecto
     */
    public Proyecto(Integer idProyecto, String nombre, boolean activo, String pais, String responsableONGD, String tipo) {
        this.idProyecto = idProyecto;
        this.nombre = nombre;
        this.activo = activo;
        this.pais = pais;
        this.responsableONGD = responsableONGD;
        this.tipo = tipo;
    }

    /**
     * Método que devuelve el valor de la variable idProyecto.
     * @return idProyecto
     * @see #setIdProyecto
     */
    public Integer getIdProyecto() {
        return idProyecto;
    }

    /**
     * Método que establece el valor de la variable idProyecto.
     * @param idProyecto Nuevo valor de la variable
     * @see #getIdProyecto
     */
    public void setIdProyecto(Integer idProyecto) {
        this.idProyecto = idProyecto;
    }

    /**
     * Método que devuelve el valor de la variable nombre.
     * @return nombre
     * @see #setNombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Método que establece el valor de la variable nombre.
     * @param nombre Nuevo valor de la variable
     * @see #getNombre
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Método que devuelve el valor de la variable activo.
     * @return activo
     * @see #setActivo
     */
    public boolean getActivo() {
        return activo;
    }

    /**
     * Método que establece el valor de la variable activo.
     * @param activo Nuevo valor de la variable
     * @see #getActivo
     */
    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    /**
     * Método que devuelve el valor de la variable localidad.
     * @return localidad
     * @see #setLocalidad
     */
    public String getLocalidad() {
        return localidad;
    }

    /**
     * Método que establece el valor de la variable localidad.
     * @param localidad Nuevo valor de la variable
     * @see #getLocalidad
     */
    public void setLocalidad(String localidad) {
        this.localidad = localidad;
    }

    /**
     * Método que devuelve el valor de la variable provincia.
     * @return provincia
     * @see #setProvincia
     */
    public String getProvincia() {
        return provincia;
    }

    /**
     * Método que establece el valor de la variable provincia.
     * @param provincia Nuevo valor de la variable
     * @see #getProvincia
     */
    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }

    /**
     * Método que devuelve el valor de la variable region.
     * @return region
     * @see #setRegion
     */
    public String getRegion() {
        return region;
    }

    /**
     * Método que establece el valor de la variable region.
     * @param region Nuevo valor de la variable
     * @see #getRegion
     */
    public void setRegion(String region) {
        this.region = region;
    }

    /**
     * Método que devuelve el valor de la variable pais.
     * @return pais
     * @see #setPais
     */
    public String getPais() {
        return pais;
    }

    /**
     * Método que establece el valor de la variable pais.
     * @param pais Nuevo valor de la variable
     * @see #getPais
     */
    public void setPais(String pais) {
        this.pais = pais;
    }

    /**
     * Método que devuelve el valor de la variable documentoAdjunto.
     * @return documentoAdjunto
     * @see #setDocumentoAdjunto
     */
    public String getDocumentoAdjunto() {
        return documentoAdjunto;
    }

    /**
     * Método que establece el valor de la variable documentoAdjunto.
     * @param documentoAdjunto Nuevo valor de la variable
     * @see #getDocumentoAdjunto
     */
    public void setDocumentoAdjunto(String documentoAdjunto) {
        this.documentoAdjunto = documentoAdjunto;
    }

    /**
     * Método que devuelve el valor de la variable socioLocal.
     * @return socioLocal
     * @see #setSocioLocal
     */
    public String getSocioLocal() {
        return socioLocal;
    }

    /**
     * Método que establece el valor de la variable socioLocal.
     * @param socioLocal Nuevo valor de la variable
     * @see #getSocioLocal
     */
    public void setSocioLocal(String socioLocal) {
        if (!esProyectoSensibilizacion()) {
            this.socioLocal = socioLocal;
        }
    }

    /**
     * Método que devuelve el valor de la variable fechaInicio.
     * @return fechaInicio
     * @see #setFechaInicio
     */
    public Date getFechaInicio() {
        return fechaInicio;
    }

    /**
     * Método que establece el valor de la variable fechaInicio.
     * @param fechaInicio Nuevo valor de la variable
     * @see #getFechaInicio
     */
    public void setFechaInicio(Date fechaInicio) {
        if (esProyectoCooperacion() || esProyectoSensibilizacion()) {
            this.fechaInicio = fechaInicio;
        }
    }

    /**
     * Método que devuelve el valor de la variable responsableONGD.
     * @return responsableONGD
     * @see #setResponsableONGD
     */
    public String getResponsableONGD() {
        return responsableONGD;
    }

    /**
     * Método que establece el valor de la variable responsableONGD.
     * @param responsableONGD Nuevo valor de la variable
     * @see #getResponsableONGD
     */
    public void setResponsableONGD(String responsableONGD) {
        this.responsableONGD = responsableONGD;
    }

    /**
     * Método que devuelve el valor de la variable fechaEntrega.
     * @return fechaEntrega
     * @see #setFechaEntrega
     */
    public Date getFechaEntrega() {
        return fechaEntrega;
    }

    /**
     * Método que establece el valor de la variable fechaEntrega.
     * @param fechaEntrega Nuevo valor de la variable
     * @see #getFechaEntrega
     */
    public void setFechaEntrega(Date fechaEntrega) {
        if (esProyectoCooperacion() || esProyectoSensibilizacion()) {
            this.fechaEntrega = fechaEntrega;
        }
    }

    /**
     * Método que devuelve el valor de la variable presupuestoTotal.
     * @return presupuestoTotal
     * @see #setPresupuestoTotal
     */
    public Double getPresupuestoTotal() {
        return presupuestoTotal;
    }

    /**
     * Método que establece el valor de la variable presupuestoTotal.
     * @param presupuestoTotal Nuevo valor de la variable
     * @see #getPresupuestoTotal
     */
    public void setPresupuestoTotal(Double presupuestoTotal) {
        if (esProyectoCooperacion() || esProyectoSensibilizacion()) {
            this.presupuestoTotal = presupuestoTotal;
        }
    }

    /**
     * Método que devuelve el valor de la variable fechaFin.
     * @return fechaFin
     * @see #setFechaFin
     */
    public Date getFechaFin() {
        return fechaFin;
    }

    /**
     * Método que establece el valor de la variable fechaFin.
     * @param fechaFin Nuevo valor de la variable
     * @see #getFechaFin
     */
    public void setFechaFin(Date fechaFin) {
        if (esProyectoCooperacion() || esProyectoSensibilizacion()) {
            this.fechaFin = fechaFin;
        }
    }

    /**
     * Método que devuelve el valor de la variable tipo.
     * @return tipo
     * @see #setTipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * Método que establece el valor de la variable tipo.
     * @param tipo Nuevo valor de la variable
     * @see #getTipo
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * Método que devuelve el valor de la variable descripcion.
     * @return descripcion
     * @see #setDescripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * Método que establece el valor de la variable descripción.
     * @param descripcion Nuevo valor de la variable
     * @see #getDescripcion
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * Método que devuelve el valor de la variable personaList.
     * @return personaList
     * @see #setPersonaList
     */
    @XmlTransient
    public List<Persona> getPersonaList() {
        return personaList;
    }

    /**
     * Método que establece el valor de la variable personaList.
     * @param personaList Nuevo valor de la variable
     * @see #getPersonaList
     */
    public void setPersonaList(List<Persona> personaList) {
        if (esProyectoApadrinamientoGeneral() || esProyectoApadrinamientoPersonal()) {
            this.personaList = personaList;
        }else{
            this.personaList= new ArrayList<Persona>();
        }
    }

    /**
     * Método que devuelve el valor de la variable idProyecto.
     * @return idProyecto
     * @see #setSubvencionList
     */
    @XmlTransient
    public List<Subvencion> getSubvencionList() {
        return subvencionList;
    }

    /**
     * Método que establece el valor de la variable subvencionList.
     * @param subvencionList Nuevo valor de la variable
     * @see #getSubvencionList
     */
    public void setSubvencionList(List<Subvencion> subvencionList) {
        if (esProyectoCooperacion() || esProyectoSensibilizacion()) {
            this.subvencionList = subvencionList;
        }else
            this.subvencionList= new ArrayList<Subvencion>();
    }

    /**
     * Método que devuelve el valor de la variable apadrinadoList.
     * @return apadrinadoList
     * @see #setApadrinadoList
     */
    @XmlTransient
    public List<Apadrinado> getApadrinadoList() {
        return apadrinadoList;
    }

    /**
     * Método que establece el valor de la variable apadrinadoList.
     * @param apadrinadoList Nuevo valor de la variable
     * @see #getApadrinadoList
     */
    public void setApadrinadoList(List<Apadrinado> apadrinadoList) {
        if (esProyectoApadrinamientoPersonal()) {
            this.apadrinadoList = apadrinadoList;
        }else
            this.apadrinadoList= new ArrayList<Apadrinado>();
    }

    /**
     * Método que devuelve el valor de la variable personaContactoList.
     * @return personaContactoList
     * @see #setPersonaContactoList
     */
    @XmlTransient
    public List<PersonaContacto> getPersonaContactoList() {
        return personaContactoList;
    }

    /**
     * Método que establece el valor de la variable personaContactoList.
     * @param personaContactoList Nuevo valor de la variable
     * @see #getPersonaContactoList
     */
    public void setPersonaContactoList(List<PersonaContacto> personaContactoList) {
        this.personaContactoList = personaContactoList;
    }
    
    /**
     * Método que indica si un proyecto es de cooperacion.
     * @return true o false en función del tipo de proyecto
     */
    public boolean esProyectoCooperacion() {
        return tipo.compareTo("C") == 0;
    }

    /**
     * Método que indica si un proyecto es de sensibilización.
     * @return true o false en función del tipo de proyecto
     */
    public boolean esProyectoSensibilizacion() {
        return tipo.compareTo("S") == 0;
    }

    /**
     * Método que indica si un proyecto es de apadrinamiento general.
     * @return true o false en función del tipo de proyecto
     */
    public boolean esProyectoApadrinamientoGeneral() {
        return tipo.compareTo("AG") == 0;
    }

    /**
     * Método que indica si un proyecto es de apadrinamiento Personal.
     * @return true o false en función del tipo de proyecto
     */
    public boolean esProyectoApadrinamientoPersonal() {
        return tipo.compareTo("AP") == 0;
    }

    /**
     * Método que devuelve un número con una propiedad fundamental, si dos 
     * objetos son iguales el valor retornado por sus respectivos hashCode 
     * debe ser igual.
     * @return hash
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idProyecto != null ? idProyecto.hashCode() : 0);
        return hash;
    }

    /**
     * Método que compara si dos proyectos son iguales.
     * @param object Objeto a comparar
     * @return true o false
     */
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Proyecto)) {
            return false;
        }
        Proyecto other = (Proyecto) object;
        if ((this.idProyecto == null && other.idProyecto != null) || (this.idProyecto != null && !this.idProyecto.equals(other.idProyecto))) {
            return false;
        }
        return true;
    }

    /**
     * Método que devuelve una cadena con proyecto.
     * @return string
     */
    @Override
    public String toString() {
        return "ongd.negocio.entidades.Proyecto[ idProyecto=" + idProyecto + " ]";
    }   
}
